/*
 * Copyright (C) 2016 yixun All Rights Reserved.
 * 
 * CustomerMapper.java
 */
package com.emm.yixun.basic.mapper;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.emm.yixun.common.app.servletentity.CusAnalysisListRes;
import com.emm.yixun.common.app.servletentity.CusVisitAnalysisListRes;
import com.emm.yixun.common.enums.SalesReportDto;
import com.emm.yixun.common.model.Customer;
import com.emm.yixun.common.model.Project;
import com.emm.yixun.common.model.appDto.AuditListDto;
import com.emm.yixun.common.model.appDto.CustomerCountDto;
import com.emm.yixun.common.model.appDto.CustomerTopCount;
import com.emm.yixun.common.model.appDto.HeroCount;
import com.emm.yixun.common.model.appDto.MemberScoreCount;
import com.emm.yixun.common.model.appDto.WorkloadCount;
import com.emm.yixun.common.model.dto.ClientDataParams;
import com.emm.yixun.common.model.dto.ContactWayDto;
import com.emm.yixun.common.model.dto.CustomerComponentDto;
import com.emm.yixun.common.model.dto.CustomerDto;
import com.emm.yixun.common.model.pmo.ClientData;

/**
 * [文件名称]<br>
 * CustomerMapper.java<br>
 * <br>
 * [文件描述]<br>
 * 客户信息表 mapper<br>
 * <br>
 * [修改记录]<br>
 * 2016-05-16 11:03:45 创建<br>
 * 
 * @version 1.00
 */
public interface CustomerMapper {

	/**
	 * 新增
	 * 
	 * @param customer
	 *            新增BEAN信息
	 * @return 操作行数
	 */
	public int add(Customer customer);

	/**
	 * 删除
	 * 
	 * @param customerDto
	 *            满足删除的条件
	 * @return 操作行数
	 */
	public int del(CustomerDto customerDto);

	/**
	 * 删除
	 * 
	 * @param ids
	 *            待删除的唯一主键拼接的字符串,主键间以,隔开
	 * @return 操作行数
	 */
	public int dels(String ids);

	/**
	 * 编辑
	 * 
	 * @param customer
	 *            需要编辑的BEAN信息
	 */
	public int edit(Customer customer);

	/**
	 * 编辑
	 * 
	 * @param customer
	 *            需要编辑的BEAN信息
	 */
	public int editCus(Customer customer);

	/**
	 * 编辑
	 * 
	 * @param customerDto
	 *            需要编辑的BEAN信息
	 * @param ids
	 *            待编辑的唯一主键拼接的字符串,主键间以,隔开
	 * @return 更新行数
	 */
	public int edits(@Param("customerDto") Customer customer, @Param("ids") String ids);

	/**
	 * 搜索总数
	 * 
	 * @param customerDto
	 *            搜索条件
	 * @return 符合条件记录总数
	 */
	public int count(CustomerDto customerDto);

	/**
	 * 搜索 - 支持分页
	 * 
	 * @param blackWhiteList
	 *            blackWhiteList(搜索条件)
	 * @param beginNum
	 *            分页开始页不包含
	 * @param endNum
	 *            分页结束页不包含
	 * @return 分页数据
	 */
	public List<Customer> list(@Param("customerDto") CustomerDto customerDto, @Param("beginNum") int beginNum,
			@Param("endNum") int endNum);

	/**
	 * 搜索
	 * 
	 * @param customerDto
	 *            blackWhiteList(搜索条件)
	 * @return 分页数据
	 */
	public List<Customer> selectListByDto(@Param("customerDto") CustomerDto customerDto);

	/**
	 * 搜索 - 支持分页
	 * 
	 * @param customerDto
	 *            blackWhiteList(搜索条件)
	 * @return 分页数据
	 */
	public Customer selectByDto(@Param("customerDto") CustomerDto customerDto);

	/**
	 * @param id
	 * @return 根据id查询记录
	 */
	public Customer selectById(@Param("id") Long id);

	/**
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userCode查询记录
	 */
	public CustomerTopCount selectCountByCus(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userCode、timeType查询记录
	 */
	public MemberScoreCount selectScoreCountByCus(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 个人英雄榜数量统计 - 认筹
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectHeroCountByCusRc(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 个人英雄榜数量统计 - 认购
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectHeroCountByCusRg(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 个人英雄榜数量统计 - 签约
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectHeroCountByCusQy(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 销售组英雄榜数量统计 - 认筹
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectHeroAmountCountByCusRc(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 销售组英雄榜数量统计 - 认购
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectHeroAmountCountByCusRg(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 销售组英雄榜数量统计 - 签约
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectHeroAmountCountByCusQy(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode查询记录
	 */
	public List<WorkloadCount> selectWorkloadCountByCus(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 查询客户分析
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、categoryType查询记录
	 */
	public List<CusAnalysisListRes> selectCustomerAnalysisCountByCus(
			@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 查询客户分析 - 客户交易状态
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、categoryType查询记录
	 */
	public List<CusAnalysisListRes> selectCustomerAnalysisTradeStatusCountByCus(
			@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 查询客户来访分析
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、visitTimeType查询记录
	 */
	public List<CusVisitAnalysisListRes> selectCustomerVisitAnalysisCountByCus(
			@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 搜索总数
	 * 
	 * @param customerDto
	 *            搜索条件
	 * @return 符合条件记录总数
	 */
	public int getCustomerCount(CustomerDto customerDto);

	/**
	 * 搜索 - 支持分页
	 * 
	 * @param blackWhiteList
	 *            blackWhiteList(搜索条件)
	 * @param beginNum
	 *            分页开始页不包含
	 * @param endNum
	 *            分页结束页不包含
	 * @return 分页数据
	 */
	public List<Customer> getCustomerList(@Param("customerDto") CustomerDto customerDto,
			@Param("beginNum") int beginNum, @Param("endNum") int endNum);

	/**
	 * 搜索 - 支持分页
	 * 
	 * @param customerDto
	 *            (搜索条件)
	 * @param beginNum
	 *            分页开始页不包含
	 * @param endNum
	 *            分页结束页不包含
	 * @return 分页数据
	 */
	public List<Customer> getCustomerByFuzzyQuery(@Param("customerDto") CustomerDto customerDto);

	/**
	 * 搜索总数
	 * 
	 * @param customerDto
	 *            搜索条件
	 * @return 符合条件记录总数
	 */
	public int selectByAuditCount(CustomerCountDto customerCountDto);

	/**
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userCode查询记录
	 */
	public List<AuditListDto> selectByAuditList(@Param("customerCountDto") CustomerCountDto customerCountDto,
			@Param("beginNum") int beginNum, @Param("endNum") int endNum);

	/**
	 * 搜索总数
	 * 
	 * @param customerDto
	 *            搜索条件
	 * @return 符合条件记录总数
	 */
	public int selectCustomerByCount(CustomerCountDto customerCountDto);

	/**
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userCode查询记录
	 */
	public List<Customer> selectCustomerByList(@Param("customerCountDto") CustomerCountDto customerCountDto,
			@Param("beginNum") int beginNum, @Param("endNum") int endNum);

	int selectImperfectCustomerByCount(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 查询未完善客户信息李彪
	 * 
	 * @param customerCountDto
	 * @param beginNum
	 * @param endNum
	 * @return
	 */
	List<Customer> selectImperfectCustomerByList(@Param("customerCountDto") CustomerCountDto customerCountDto,
			@Param("beginNum") int beginNum, @Param("endNum") int endNum);

	/**
	 * 搜索总数
	 * 
	 * @param customerDto
	 *            搜索条件
	 * @return 符合条件记录总数
	 */
	public int selectSubscribeCustomerByCount(CustomerCountDto customerCountDto);

	/**
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userCode查询记录
	 */
	public List<Customer> selectSubscribeCustomerByList(@Param("customerCountDto") CustomerCountDto customerCountDto,
			@Param("beginNum") int beginNum, @Param("endNum") int endNum);

	/**
	 * 搜索总数
	 * 
	 * @param customerDto
	 *            搜索条件
	 * @return 符合条件记录总数
	 */
	public int selectPaymentCustomerByCount(CustomerCountDto customerCountDto);

	/**
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userCode查询记录
	 */
	public List<Customer> selectPaymentCustomerByList(@Param("customerCountDto") CustomerCountDto customerCountDto,
			@Param("beginNum") int beginNum, @Param("endNum") int endNum);

	public List<Project> selectCustomerProject(
			@Param("customerComponentDto") CustomerComponentDto customerComponentDto);

	// 客户选择组件
	public List<CustomerComponentDto> selectCustomerComponentPage(
			@Param("customerComponentDto") CustomerComponentDto customerComponentDto, @Param("beginNum") int beginNum,
			@Param("endNum") int endNum);

	public List<CustomerComponentDto> selectCustomerPage(
			@Param("customerComponentDto") CustomerComponentDto customerComponentDto, @Param("beginNum") int beginNum,
			@Param("endNum") int endNum);

	public Integer selectCustomerPageCount(@Param("customerComponentDto") CustomerComponentDto customerComponentDto);

	List<CustomerComponentDto> selectCustomerIntentionPage(
			@Param("customerComponentDto") CustomerComponentDto customerComponentDto, @Param("beginNum") int beginNum,
			@Param("endNum") int endNum);

	Integer selectCustomerPageIntentionCount(@Param("customerComponentDto") CustomerComponentDto customerComponentDto);

	public List<CustomerComponentDto> selectCustomerAll(
			@Param("customerComponentDto") CustomerComponentDto customerComponentDto);

	// 客户选择组件记录数量查询
	public Integer selectCustomerComponentPageCount(
			@Param("customerComponentDto") CustomerComponentDto customerComponentDto);

	/**
	 * 销售组（认筹）数量统计
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectGroupHeroCountByCusRc(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 销售组（认购）数量统计
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectGroupHeroCountByCusRg(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 销售组（签约）数量统计
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectGroupHeroCountByCusQy(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 销售组（认筹）金额统计
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectGroupHeroAmountCountByCusRc(
			@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 销售组（认购）金额统计
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectGroupHeroAmountCountByCusRg(
			@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 销售组（签约）金额统计
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、timeType、cusType查询记录
	 */
	public List<HeroCount> selectGroupHeroAmountCountByCusQy(
			@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 查询【客户搜索】待处理客户列表
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userId查询记录
	 */
	public List<Customer> selectSearchCustomerByList(@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 查询【客户搜索】逾期未签约列表
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userCode查询记录
	 */
	public List<Customer> selectSearchSubscribeCustomerByList(
			@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 查询【客户搜索】逾期未付款列表
	 * 
	 * @param customerCountDto
	 * @return 根据merchantId、projectCode、userCode查询记录
	 */
	public List<Customer> selectSearchPaymentCustomerByList(
			@Param("customerCountDto") CustomerCountDto customerCountDto);

	/**
	 * 查询新增客户时手机号码与客户个人信息手机号码2是否重复 1、同项目下，两个手机号互相查重； 2、不同项目下，相同手机号可以并存，但两个手机号需查重。
	 * 
	 * @param customerDto
	 * @return 根据merchantId、customerPhone、peMobile查询记录
	 */
	public List<Customer> selectCustomerPhoneByList(@Param("customerDto") CustomerDto customerDto);

	/**
	 * 查询新增客户时手机号码与客户个人信息手机号码2是否重复 1、同项目下，两个手机号互相查重； 2、不同项目下，相同手机号可以并存，但两个手机号需查重。
	 * 
	 * @param customerDto
	 * @return 根据merchantId、customerPhone、peMobile查询记录
	 */
	public List<Customer> selectCustomerPhoneByListPC(@Param("customerDto") CustomerDto customerDto);

	/**
	 * 根据姓名或手机号查询客户数量
	 * 
	 * @param customerComponentDto
	 * @return
	 */
	public Integer findCustomerPageByNameOrPhoneCount(
			@Param("customerComponentDto") CustomerComponentDto customerComponentDto);

	/**
	 * 根据姓名或手机号查询客户
	 * 
	 * @param customerComponentDto
	 * @param beginNum
	 * @param endNum
	 * @return
	 */
	public List<CustomerComponentDto> findCustomerPageByNameOrPhone(
			@Param("customerComponentDto") CustomerComponentDto customerComponentDto, @Param("beginNum") int beginNum,
			@Param("endNum") int endNum);

	/**
	 * 根据销售组用户更新客户信息 功能描述: <br>
	 * 〈功能详细描述〉
	 * 
	 * @param customerDto
	 * @return
	 * @see [相关类/方法](可选)
	 * @since [产品/模块版本](可选)
	 */
	public int updateBySaleGroupUser(CustomerDto customerDto);

	/**
	 * 跟进客户ID查询客户业务状态
	 * 
	 * @param id
	 * @return 业务状态
	 */
	public String queryCustomerBusiness(@Param("id") Long id);

	/**
	 * 搜索
	 * 
	 * @param blackWhiteList
	 *            blackWhiteList(搜索条件)
	 * @return 分页数据
	 */
	public List<CustomerDto> setBirthByDto(@Param("customerDto") CustomerDto customerDto);

	/**
	 * 
	 * queryProjectFtContactWay:绿城微信OA报表. <br/>
	 *
	 * @author Administrator
	 * @param contactWayDto
	 * @return
	 * @since JDK 1.6
	 */
	public List<ContactWayDto> queryProjectFtContactWay(@Param("contactWayDto") ContactWayDto contactWayDto);

	/**
	 * 搜索 - 支持分页
	 * 
	 * @param blackWhiteList
	 *            blackWhiteList(搜索条件)
	 * @return 分页数据
	 */
	public Customer getSubjectRatio(@Param("customerDto") CustomerDto customerDto);

	/*
	 * 
	 * queryCustomerLevel:客户等级报表 <br/>
	 *
	 * @author Administrator
	 * 
	 * @param projectId
	 * 
	 * @param startTime
	 * 
	 * @param endTime
	 * 
	 * @return
	 * 
	 * @since JDK 1.6
	 */
	public HashMap<String, Long> queryCustomerLevel(@Param("contactWayDto") ContactWayDto contactWayDto);

	/**
	 * 
	 * queryProjectSignedInfo:(销售报表). <br/>
	 *
	 * @author Administrator
	 * @return
	 * @since JDK 1.6
	 */
	public List<SalesReportDto> queryProjectSignedInfo(@Param("contactWayDto") ContactWayDto contactWayDto);

	/**
	 * 汇总查询，不区分业态统计
	 * 
	 * @param contactWayDto
	 * @return
	 */
	public List<SalesReportDto> queryProjectSignedInfoByIds(@Param("contactWayDto") ContactWayDto contactWayDto);

	/**
	 * 项目分时间段统计客户情况
	 * 
	 * @param clientDataParams
	 * @return
	 */
	public List<ClientData> queryCustomerLevelByPmo(@Param("clientDataParams") ClientDataParams clientDataParams);

}
